package com.STS.ELearning.Classes
{
	import com.STS.ELearning.DAO.Kullanicilar;
	import com.STS.ELearning.Events.KullaniciEvent;
	import com.STS.ELearning.Events.Mesaj;
	import com.STS.ELearning.VO.KonularVO;
	import com.STS.ELearning.VO.KullanicilarVO;
	import com.STS.ELearning.VO.SinavlarVO;
	import com.STS.ELearning.VO.VideoVO;
	import com.STS.ELearning.views.DersEkle;
	import com.STS.ELearning.views.DersGoster;
	import com.STS.ELearning.views.DersMetniGoster;
	import com.STS.ELearning.views.HOSCAKAL;
	import com.STS.ELearning.views.IcerikSayfasi;
	import com.STS.ELearning.views.Menu;
	import com.STS.ELearning.views.SinavUygula;
	
	import flash.desktop.NativeApplication;
	import flash.display.DisplayObject;
	import flash.display.NativeWindow;
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.InvokeEvent;
	import flash.events.SQLEvent;
	import flash.external.ExternalInterface;
	import flash.media.Video;
	import flash.system.System;
	import flash.utils.describeType;
	import flash.utils.setTimeout;
	
	import mx.controls.Alert;
	import mx.core.Application;
	import mx.core.UIComponent;
	import mx.events.CloseEvent;
	import mx.events.FlexEvent;
	import mx.managers.PopUpManager;
	import mx.messaging.events.MessageEvent;
	import mx.utils.StringUtil;

	[Event(name="IcerikDegisecek",type="mx.messaging.events.MessageEvent")]//durdurulablir preventDefault ve ispreventdefault
	[Event(name="IcerikDegisti",type="mx.messaging.events.MessageEvent")]
	[Event(name="IcerikDegismedi",type="mx.messaging.events.MessageEvent")]
	[Event(name="KullaniciGirisYapti",type="mx.messaging.events.MessageEvent")]
	public class IcerikYoneticisi extends Base
	{
		public static const EICERIK_DEGISECEK:String="IcerikDegisecek";
		public static const EICERIK_DEGISTI:String="IcerikDegisti";
		public static const EICERIK_DEGISMEDI:String="IcerikDegismedi";
		public static const EKULLANICI_GIRISYAPTI:String="KullaniciGirisYapti";
		public var Kullanici:KullanicilarVO;
		public var DersIs:DersIslemleri=new DersIslemleri();
		
		public function IcerikYoneticisi(lock:SingletonLock)
		{
			super();
		}
		
		private var _menu:Menu;
		public function set menu(_menu:Menu):void
		{
			this._menu=_menu;
		}
		public function get menu():Menu
		{
			return this._menu;
		}
		public function updateMenu():void
		{
			this._menu.init(true);
		}
		
		private var _main:Main;
		public function set main(_main:Main):void
		{
			this._main=_main;
		}
		public function get main():Main
		{
			return this._main;
		}
		
		private static var instance:IcerikYoneticisi;
		public static function getInstance(icerikBarindirici:UIComponent=null,kul:KullanicilarVO=null):IcerikYoneticisi {
			if( instance == null )
			{
				if(icerikBarindirici==null)
					throw new Error("İçerik barındıcısı henuz oluşturulmamışsa getInstance metodu argumansız çağrılamaz.");
				if(kul==null)
					throw new Error("Kullanıcı girişi yapılmadan içerik yöneticisi oluşturulamaz.");
				var ki:KullaniciIslemleri=KullaniciIslemleri.getInstance();
				instance = new IcerikYoneticisi( new SingletonLock );
				instance.IcerikBarindirici=icerikBarindirici;
				instance.Kullanici=kul;				
				ki.addEventListener(KullaniciEvent.KULLANICI_DUZENLENDI ,function(evtx:KullaniciEvent):void{
					instance.Kullanici=evtx.Kullanici;
				});
				NativeApplication.nativeApplication.addEventListener(Event.EXITING,function(exitingEvent:Event):void{
					var winClosingEvent:Event;
					for each (var win:NativeWindow in NativeApplication.nativeApplication.openedWindows) {
						
						if(exitingEvent.target!=win)
						{
							winClosingEvent = new Event(Event.CLOSING,false,true);
							win.dispatchEvent(winClosingEvent);
							if (!winClosingEvent.isDefaultPrevented()) {
								win.close();
							} else {
								exitingEvent.preventDefault();
							}
						}
					}
					if (!exitingEvent.isDefaultPrevented()) {
						ki.cikisLog(kul);
						NativeApplication.nativeApplication.exit();
					}
				});					
			}
			return instance;
		}
		private var _Icerik:IcerikSayfasi=null;
		private var _OncekiIcerik:IcerikSayfasi=null;
		public function get Icerik():DisplayObject
		{
			return _Icerik;	
		}
		
		private var _IcerikBarindirici:UIComponent=null;
		public function get IcerikBarindirici():UIComponent
		{
			return IcerikBarindirici;	
		}
		
		public function set IcerikBarindirici(value:UIComponent):void
		{
			_IcerikBarindirici=value;	
		}
		public function IcerikYukle(icrk:IcerikSayfasi,zorla:Boolean=false):Boolean
		{
			var evt:MessageEvent=new MessageEvent(
				EICERIK_DEGISECEK,false,true,
				new Mesaj(icrk.name,{"AktifIcerik":_Icerik,"YuklenecekIcerik":icrk}));
				
			dispatchEvent(evt);
			if(evt.isDefaultPrevented())
			{
				dispatchEvent(new MessageEvent(EICERIK_DEGISMEDI,
					false,false,new Mesaj(icrk.name,{"AktifIcerik":_Icerik,"YuklenecekIcerik":icrk})));
				return false;	
			}
			if(icrk!=null)
			{
				if(_Icerik!=null)
				{
					if((icrk.className)==(_Icerik.className) && zorla==false)//zaten içerik yukluyse
					{	
						icrk=null;
						icrk=_Icerik;
						System.gc();
						dispatchEvent(new MessageEvent(EICERIK_DEGISTI,false,false,new Mesaj(icrk.name,{"AktifIcerik":_Icerik,"KaldirilanIcerik":_OncekiIcerik})));
						return true;
					}
					_IcerikBarindirici.removeChild(_Icerik);
					System.gc();
				}
				icrk.addEventListener(FlexEvent.CREATION_COMPLETE,function(evtxxx:FlexEvent):void{
					_OncekiIcerik=null;
					if(_Icerik!=null && _Icerik.className!="DersGoster")
						_OncekiIcerik=_Icerik;
					_Icerik=icrk;
					System.gc();
					dispatchEvent(new MessageEvent(EICERIK_DEGISTI,false,false,new Mesaj(icrk.name,{"AktifIcerik":_Icerik,"KaldirilanIcerik":_OncekiIcerik})));
				});
				_IcerikBarindirici.addChild(icrk);
				return true;
			}
			return false;
		}
		
		
		
		
		
		private var aktifKonu:KonularVO;
		
		public function MetinYukle(id:int):void
		{
			aktifKonu=DersIs.GetKonuVideo(id);
			if(aktifKonu!=null && (StringUtil.trim(aktifKonu.metin)!="" ))
			{
				var dmg:DersMetniGoster=new DersMetniGoster();
				this.addEventListener(IcerikYoneticisi.EICERIK_DEGISTI,function(idev:MessageEvent):void{
					(idev.message.body.AktifIcerik as DersMetniGoster).LoadPdf(aktifKonu);
				});
				IcerikYukle(dmg);
			
			}else
			{
				Alert.show("Bu konunun içeriği henüz eklenmemiş!","Uyarı");
			}			
		}
		
		
		private var DG:DersGoster;
		private var cagrisayisi:int=0;
		public function KonuYukle(id:int):void
		{			
			aktifKonu=DersIs.GetKonuVideo(id);
			if(aktifKonu!=null && (StringUtil.trim(aktifKonu.video)!=""))
			{
					DG=new DersGoster();
					cagrisayisi=0;
					this.addEventListener(IcerikYoneticisi.EICERIK_DEGISTI,function (mevt:MessageEvent):void{
						var x:Function=function():void{
							IcerikYoneticisi.getInstance().removeEventListener(IcerikYoneticisi.EICERIK_DEGISTI,arguments.callee);
							if(cagrisayisi==1) { return;}
							else cagrisayisi++;
							var vd:VideoVO=new VideoVO();
							vd.ad=aktifKonu.ad;
							vd.video=aktifKonu.video;
							vd.konu=aktifKonu;
							DG=mevt.message.body["AktifIcerik"] as DersGoster;
							DG.Yukle(vd);	
							_main.activate();
						}
						x.call();
					});
					IcerikYukle(DG);
			}else
			{
				Alert.show("Bu konunun içeriği henüz eklenmemiş!","Uyarı");
			}			
		}
		
		private var aktifSinav:SinavlarVO;
		
		
		public function SinavYukle(id:int):void
		{
			
			aktifSinav=DersIs.GetSinavVideo(id);
			if(aktifSinav!=null && (StringUtil.trim(aktifSinav.sinavyol)!=""))
			{
				DG=new SinavUygula() as DersGoster;
				var cagrisayisi:int=0;
				this.addEventListener(IcerikYoneticisi.EICERIK_DEGISTI,function (mevt:MessageEvent):void{
					var x:Function=function():void{
						IcerikYoneticisi.getInstance().removeEventListener(IcerikYoneticisi.EICERIK_DEGISTI,arguments.callee);
						if(cagrisayisi==1) { return;}
						else cagrisayisi++;
						if(cagrisayisi==1) return;
						else cagrisayisi++;
						var vd:VideoVO=new VideoVO();
						vd.ad=aktifSinav.ad;
						vd.video=aktifSinav.sinavyol;
						vd.sinav=aktifSinav;
						DG=mevt.message.body["AktifIcerik"] as DersGoster;
						DG.Yukle(vd);	
						_main.activate();
						
					}
					x.call();
				});
				IcerikYukle(DG);
			}else
			{
				Alert.show("Bu sınavın içeriği henüz eklenmemiş!","Uyarı");
			}			
		}
		public function Geri():void
		{
			IcerikYukle(_OncekiIcerik);
		}
	}
}
class SingletonLock {}